package com.ftg.learn.day11;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author 布衣
 */
public class LearnReflect {

    /**
     * 反射 ， 可以拿到类的实例，类的构造方法
     * 1 : 反射获取所有属性信息
     * 2 ： 方法信息
     * 3 : 案例
     */
    public static void main(String[] args) {
//        Class - 类的关联
//        Filed 指的是属性的关联
//        method 指的是方法的关联
        Class<Shop> shopClass = Shop.class;
        System.out.println(shopClass.getName());

        //获取所有属性
        System.out.println("获取所有属性");
        //全部
//        Field - 某一个属性 name
//        Field - 某一个属性 address
//        Field - 某一个属性 phone
//        Field - 某一个属性 legal
        Field[] fields = shopClass.getDeclaredFields();

        //增强型for
        for(Field field : fields){
            System.out.println(field.getName());
        }

        System.out.println(fields[0].getName());
        System.out.println(fields[1].getName());
        System.out.println(fields[2].getName());
        System.out.println(fields[3].getName());

        //获取public
        Field[] fields1 = shopClass.getFields();


        try {
//            实例
            Shop s = shopClass.newInstance();
            Field name = shopClass.getDeclaredField("name");
            //可以把私有的属性改成可以访问
            name.setAccessible(true);
            name.set(s,"哈尔滨商超");

            System.out.println("获取当前属性的类型"+name.getType());

            System.out.println(name.getType() == String.class);

            System.out.println("属性上面的注解"+name.getAnnotation(Deprecated.class));

            Kjx annotation = name.getAnnotation(Kjx.class);
//            Deprecated annotation = name.getAnnotation(Deprecated.class);
            System.out.println("属性上面的注解11"+name.getAnnotation(Kjx.class));
            if(annotation != null){
                name.set(s,"康加修的商超");
            }

            System.out.println(name.get(s));

            System.out.println(name.getName()+"===>单取一个");
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }


}
